package com.castile.case1;

/**
 * @description:
 * @author: Castile
 * @create: 2024-04-08 22:57
 * @Version 1.0
 * 文档地址： https://blog.csdn.net/roykingw/article/details/110737366
 **/
public class ClassLoaderDemo {

    public static void main(String[] args) throws ClassNotFoundException {
        // 父子关系： AppClassLoader --> ExtClassLoader --> BootStrapClassLoader（顶层）
        ClassLoader c1 = ClassLoaderDemo.class.getClassLoader();
        System.out.println("class loader1: " + c1);
        System.out.println("parent of c1: " + c1.getParent());
        //BootStrapClassLoader是C++开发，是JVM虚拟机的一部分，本身不是Java类，因此无法用Java语言来描述，因此此处打印null
        System.out.println("grant parent of c1: " + c1.getParent().getParent());

        ClassLoader c2 = String.class.getClassLoader();
        System.out.println("c2: " + c2);
        System.out.println(c1.loadClass("java.util.List").getClass().getClassLoader());

        // java指令： -verbose:class -verbose:gc 在启动时打印类加载的情况
        // BootStrap ClassLader用于加载Java的基础类，这个属性不能在java指令中指定，推断不是由java语言处理
        System.out.println("BootStrapClassLoader加载目录： "+ System.getProperty("sun.boot.class.path"));
        // ExtClassLoader加载JAVA_HOME/ext下的包，可通过-Djava.ext.dirs另行指定目录
        System.out.println("ExtClassLoader加载目录："+ System.getProperty("java.ext.dirs"));
        // AppClassLoader加载的是claspath。应用下的Java包，可通过-Djava.class.path另行指定目录
        System.out.println("AppClassLoader加载目录：" + System.getProperty("java.class.path"));

    }
}
